#define _CRT_SECURE_NO_WARNINGS 1
#include <assert.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <errno.h>
//int main()
//{
//	char arr[] = "I Have An Apple";
//	//如果是大写就转换为小写，然后输出；否则直接输出
//	int i = 0;
//	while (arr[i])
//	{
//		if (isupper(arr[i]))
//		{
//			//printf("%c",tolower(arr[i]));
//			arr[i] = tolower(arr[i]);
//		}
//		printf("%c",arr[i]);
//		i++;
//	}
//	
//	return 0;
//}


//struct stu
//{
//	char name[20];
//	int age;
//}s1,s2;//全局变量
//int main()
//{
//	struct stu s3, s4;//局部变量
//}

//对结构体类型重命名

//typedef struct stu
//{
//	char name[20];
//	int age;
//}Stu;

//struct stu
//{
//	char name[20];
//	int age;
//};
//typedef struct stu Stu;
//
//int main()
//{
//	Stu s1, s2;
//	return 0;
//}

//匿名结构体类型,没有标签，一定要在创建的同时对它初始化
//不完全声明
//struct
//{
//	char name[20];
//}x;


//结构体的自引用
//结构体内包含同类型结构体的指针


//typedef struct node
//{
//	char name[20];
//	struct node* next;
//}node;


//结构体变量的定义
//struct stu
//{
//	char name[20];
//
//}p1 = {"ZHANGSAN"};//在定义类型的大括号之后定义变量，它是一个全局变量
//
//struct stu p2 = {"LISI"};//在主函数的外部定义，它是一个全局变量
//
//struct S
//{
//	int num;
//	char ch;
//	struct stu p;//结构体里面套另外一个结构体
//	float d;
//};
//
//int main()
//{
//	struct stu p3 = {"王二"};//在主函数的内部定义，是一个局部变量
//	struct S s = { 4,'f',{"ert"},3.123f };//顺序初始化
//	struct S s1 = { .ch='c',.p.name="erytu"};//乱序初始化
//	printf("%d %c %s %f\n", s.num, s.ch, s.p.name, s.d);
//	printf("%d %c %s %f\n",s1.num,s1.ch,s1.p.name,s1.d);
//	return 0;
//}

//定义变量的同时初始化


//结构体内存对齐,成员变量空间的开辟
//1.结构体的第一个成员对齐到结构体在内存中存放位置的0偏移处，占几个字节的空间，就给几个字节的空间
//2.从第二个成员开始，每个成员都要对齐到一个对齐数的整数倍处
//对齐数：结构体成员自身大小和默认对齐数的较小值
// VS：默认对齐数为8
// linux gcc ：没有默认对齐数，对齐数就是成员自身的大小
//3.结构体的总大小必须是所有成员的对齐数中最大对齐数的整数倍
#include <stddef.h>
struct s1
{
	char c1;
	int i;
	char c2;

};

//offsetof:用来计算结构体成员距离起始位置的偏移量 offsetof (type,member)
int main()
{
	printf("%d\n", sizeof(struct s1));
	printf("%d\n", offsetof(struct s1, c1));
	printf("%d\n", offsetof(struct s1, i));
	printf("%d\n",offsetof(struct s1,c2));
	return 0;
}

struct s2
{
	char c1;//对齐数为1，偏移量为0，所占空间大小为1
	char c2;//对齐数为1，偏移量为2，所占空间大小为1
	int i;//  对齐数为4，偏移量为4.所占空间大小为4      
	//4+4=8
};

struct s3
{
	double d;
	char c;
	int i;
};